package com.xadrez.modelo;

import java.util.ArrayList;
import java.util.List;

public class Cavalo extends Peca {

    public Cavalo() {
    }

    public Cavalo(Jogador jogador,Tabuleiro tabuleiro) {
        super(jogador,tabuleiro);
    }

    @Override
    public List<Posicao> recuperaMovimentosPossiveis() {
        //Primeiro recuperamos a posição da casa onde se encontra a peca.
        int posicaoX = this.getPosicaoNoTabuleiro().getX();
        int posicaoY = this.getPosicaoNoTabuleiro().getY();

        List<Posicao> lista = new ArrayList<Posicao>();

        if (!getTabuleiro().temPecaDoJogadorNaPosicao(posicaoX - 1, posicaoY + 2, getJogador()) 
                && isPosicaoDentroDosLimites(new Posicao(posicaoX - 1, posicaoY + 2))
                && !deixaReiEmCheck(new Posicao(posicaoX - 1, posicaoY + 2))) {
            lista.add(new Posicao(posicaoX - 1, posicaoY + 2));
        }

        if (!getTabuleiro().temPecaDoJogadorNaPosicao(posicaoX + 1, posicaoY + 2, getJogador()) 
                && isPosicaoDentroDosLimites(new Posicao(posicaoX + 1, posicaoY + 2))
                && !deixaReiEmCheck(new Posicao(posicaoX + 1, posicaoY + 2))) {
            lista.add(new Posicao(posicaoX + 1, posicaoY + 2));
        }

        if (!getTabuleiro().temPecaDoJogadorNaPosicao(posicaoX - 1, posicaoY - 2, getJogador()) 
                && isPosicaoDentroDosLimites(new Posicao(posicaoX - 1, posicaoY - 2))
                && !deixaReiEmCheck(new Posicao(posicaoX - 1, posicaoY - 2))) {
            lista.add(new Posicao(posicaoX - 1, posicaoY - 2));
        }

        if (!getTabuleiro().temPecaDoJogadorNaPosicao(posicaoX + 1, posicaoY - 2, getJogador()) 
                && isPosicaoDentroDosLimites(new Posicao(posicaoX + 1, posicaoY - 2))
                && !deixaReiEmCheck(new Posicao(posicaoX + 1, posicaoY - 2))) {
            lista.add(new Posicao(posicaoX + 1, posicaoY - 2));
        }

        if (!getTabuleiro().temPecaDoJogadorNaPosicao(posicaoX + 2, posicaoY + 1, getJogador()) 
                && isPosicaoDentroDosLimites(new Posicao(posicaoX + 2, posicaoY + 1))
                && !deixaReiEmCheck(new Posicao(posicaoX + 2, posicaoY + 1))) {
            lista.add(new Posicao(posicaoX + 2, posicaoY + 1));
        }

        if (!getTabuleiro().temPecaDoJogadorNaPosicao(posicaoX + 2, posicaoY - 1, getJogador()) 
                && isPosicaoDentroDosLimites(new Posicao(posicaoX + 2, posicaoY - 1))
                && !deixaReiEmCheck(new Posicao(posicaoX + 2, posicaoY - 1))) {
            lista.add(new Posicao(posicaoX + 2, posicaoY - 1));
        }

        if (!getTabuleiro().temPecaDoJogadorNaPosicao(posicaoX - 2, posicaoY + 1, getJogador()) 
                && isPosicaoDentroDosLimites(new Posicao(posicaoX - 2, posicaoY + 1))
                && !deixaReiEmCheck(new Posicao(posicaoX - 2, posicaoY + 1))) {
            lista.add(new Posicao(posicaoX - 2, posicaoY + 1));
        }

        if (!getTabuleiro().temPecaDoJogadorNaPosicao(posicaoX - 2, posicaoY - 1, getJogador()) 
                && isPosicaoDentroDosLimites(new Posicao(posicaoX - 2, posicaoY - 1))
                && !deixaReiEmCheck(new Posicao(posicaoX - 2, posicaoY - 1))) {
            lista.add(new Posicao(posicaoX - 2, posicaoY - 1));
        }

        return lista;
    }

    @Override
    public List<Posicao> recuperaMovimentosParaCheck() {
        //Primeiro recuperamos a posição da casa onde se encontra a peca.
        int posicaoX = this.getPosicaoNoTabuleiro().getX();
        int posicaoY = this.getPosicaoNoTabuleiro().getY();

        List<Posicao> lista = new ArrayList<Posicao>();
        Posicao posicaoDoReiAdversario = getTabuleiro().getJogadorAdversario(getJogador()).getReiDoJogador().getPosicaoNoTabuleiro();

        if (isPosicaoDentroDosLimites(new Posicao(posicaoX - 1, posicaoY + 2))
                && posicaoDoReiAdversario.equals(new Posicao(posicaoX - 1, posicaoY + 2))) {
            lista.add(new Posicao(posicaoX - 1, posicaoY + 2));
        }

        else if (isPosicaoDentroDosLimites(new Posicao(posicaoX + 1, posicaoY + 2))
                && posicaoDoReiAdversario.equals(new Posicao(posicaoX + 1, posicaoY + 2))) {
            lista.add(new Posicao(posicaoX + 1, posicaoY + 2));
        }
        
        else if (isPosicaoDentroDosLimites(new Posicao(posicaoX - 1, posicaoY - 2))
                && posicaoDoReiAdversario.equals(new Posicao(posicaoX - 1, posicaoY - 2))) {
            lista.add(new Posicao(posicaoX - 1, posicaoY - 2));
        }
        
        else if (isPosicaoDentroDosLimites(new Posicao(posicaoX + 1, posicaoY - 2))
                && posicaoDoReiAdversario.equals(new Posicao(posicaoX + 1, posicaoY - 2))) {
            lista.add(new Posicao(posicaoX + 1, posicaoY - 2));
        }
        
        else if (isPosicaoDentroDosLimites(new Posicao(posicaoX + 2, posicaoY + 1))
                && posicaoDoReiAdversario.equals(new Posicao(posicaoX + 2, posicaoY + 1))) {
            lista.add(new Posicao(posicaoX + 2, posicaoY + 1));
        }
        
        else if (isPosicaoDentroDosLimites(new Posicao(posicaoX + 2, posicaoY - 1))
                && posicaoDoReiAdversario.equals(new Posicao(posicaoX + 2, posicaoY - 1))) {
            lista.add(new Posicao(posicaoX + 2, posicaoY - 1));
        }
        
        else if (isPosicaoDentroDosLimites(new Posicao(posicaoX - 2, posicaoY + 1))
                && posicaoDoReiAdversario.equals(new Posicao(posicaoX - 2, posicaoY + 1))) {
            lista.add(new Posicao(posicaoX - 2, posicaoY + 1));
        }
        
        else if (isPosicaoDentroDosLimites(new Posicao(posicaoX - 2, posicaoY - 1))
                && posicaoDoReiAdversario.equals(new Posicao(posicaoX - 2, posicaoY - 1))) {
            lista.add(new Posicao(posicaoX - 2, posicaoY - 1));
        }
        
        if(lista != null && !lista.isEmpty()){
            lista.add(getPosicaoNoTabuleiro());
        }

        return lista;
    }
    
    @Override
    public String toString() {
        return "cavalo";
    }

    @Override
    public List<Posicao> caminhoAteOReiAdversario() {
        return new ArrayList<Posicao>();
    }
}
